<?php
class CMAP implements IDataType {
	protected $_value;
	public function __construct($val = null) {
		if (is_array ( $val )) {
			$this->_value = $val;
		} else {
			$this->_value = array ();
		}
	}
	
	/**
	 * <h2>清空MAP</h2>
	 *
	 * @return void
	 */
	public function clear() {
		unset ( $this->_value ); // destruct
		$this->_value = array ();
	}
	
	/**
	 * <h2>是否存在指定的Key</h2>
	 * <p>存在返回true，不存在返回false</p>
	 *
	 * @return bool
	 */
	public function containsKey($key) {
		return array_key_exists ( $key, $this->_value );
	}
	
	/**
	 * <h2>是否有指定value映射到一个或多个键</h2>
	 * <p>如果此映射将一个或多个键映射到指定值，则返回 true。</p>
	 *
	 * @param mixed $value
	 *        	要检测的值
	 * @return bool
	 */
	public function containsValue($value) {
		return in_array ( $value, $this->_value, TRUE );
	}
	
	/**
	 * <h2>获取指定的元素</h2>
	 *
	 * @param mixed $key        	
	 * @return mixed
	 */
	public function get($key) {
		if (array_key_exists ( $key, $this->_value )) {
			return $this->_value [$key];
		}
		return null;
	}
	
	/**
	 * <h2>设置指定的元素</h2>
	 *
	 * @param mixed $key        	
	 * @param mixed $val        	
	 * @return void
	 */
	public function put($key, $val) {
		$this->_value [$key] = $val;
	}
	
	/**
	 * <h2>获取映射关系的key集合</h2>
	 *
	 * @return array 映射集合的key组成的数组
	 */
	public function keySet() {
		return array_keys ( $this->_value );
	}
	
	/**
	 * <h2>是否包含映射关系</h2>
	 * <p>如果此映射中包含key-value映射，则返回<strong>true</strong></p>
	 *
	 * @return bool
	 */
	public function isEmpty() {
		return count ( $this->_value ) == 0;
	}
	
	/**
	 * <h2>返回MAP中数据长度</h2>
	 *
	 * @return int
	 */
	public function size() {
		return count ( $this->_value );
	}
	
	/**
	 * <h2>获取指定的元素</h2>
	 *
	 * @param mixed $key        	
	 * @return mixed
	 */
	public function __get($key) {
		return $this->get ( $key );
	}
	
	/**
	 * <h2>设置指定的元素</h2>
	 *
	 * @param mixed $key        	
	 * @param mixed $val        	
	 * @return void
	 */
	public function __set($key, $val) {
		$this->put ( $key, $val );
	}
}